import {computed, Ref} from 'vue';

/**
 * 将数字转化为boolean，实现双向绑定
 * @param refValue 需要绑定的值
 * @param key 对应的key
 */
export function createBooleanComputed<T>(
  refValue: Ref<T>,      // 包含目标字段的响应式对象
  key: keyof T | string | number          // 需要转换的字段名
) {
  return computed({
    // 获取时：1 → true, 其他值 → false
    get: () => refValue.value[key] === 1,

    // 设置时：true → 1, false → 0
    set: (newValue: boolean) => {
      refValue.value[key] = (newValue ? 1 : 0) as T[keyof T];
    }
  });
}

/**
 * 将指定的字符转化为ture和false
 * @param refValue 需要绑定的值
 * @param key 对应的key
 * @param isRef 为true的字符
 * @param noRef 为false的字符
 */
export function createBooleanComputedRef<T>(
  refValue: Ref<T>,      // 包含目标字段的响应式对象
  key: keyof T | string | number,          // 需要转换的字段名
  isRef: T | string | number,
  noRef: T | string | number,
) {
  return computed({
    // 获取时：1 → true, 其他值 → false
    get: () => refValue.value[key] === isRef,

    // 设置时：true → 1, false → 0
    set: (newValue: boolean) => {
      if (newValue) {
        refValue.value[key] = isRef;
      } else {
        refValue.value[key] = noRef;
      }
    }
  });
}
